﻿#define _CRT_SECURE_NO_WARNINGS 1
//二进制的转换(二进制的10)
// 0 0 0 0 1 0 1  0 - 10
//64 32 16 8 4 2  1 - 权重对应的值

//二进制转八进制(二进制的10转八进制的10)
//001 010
//  1  2 

//二进制转十六进制(二进制的10转16进制的10)
//1010
//0x0a 

//正整数的原码、反码、补码(都相同)
//10
//00000000000000000000000000001010 - 原码
//00000000000000000000000000001010 - 反码
//00000000000000000000000000001010 - 补码

//负数的原码、反码、补码(略有不同)
//-10
//10000000000000000000000000001010 - 原码
//11111111111111111111111111110101 - 反码(符号位不变，其他位取反)
//11111111111111111111111111110110 - 补码(反码+1)

//移位操作符
//左移操作符的使用
//#include<stdio.h>
//
//int main()
//{
//	int a = 10;
//	int c = 0;
//	c = a << 1;//<<左移操作符(操作的是二进制的补码), 往左移1位，后边补0
//	printf("%d\n", c);
//	//00000000000000000000000000001010 - a的原码
//	//00000000000000000000000000010100 - 左移1位的a=20
//
//	return 0;
//}

//右移操作符的使用
//#include<stdio.h>
//
//int main()
//{
//	int a = 10;
//	int c = 0;
//	//>>右移操作符(操作的是二进制的补码), 往右移1位，后边补什么会有两个选择:
//	//逻辑右移: 向右移动1位,左边补1
//	//算术右移: 向右移动1位,看原先的符号位是1就补1,是0就补0
//	c = a >> 1;
//	//00000000000000000000000000001010 - a的原码
//	//00000000000000000000000000000101 - 右移1位的a=5
//	printf("%d\n", c);
//	
//
//	return 0;
//}

//位操作符：& 、 | 、 ^ 、~
//#include<stdio.h>
//
//int main()
//{
//	int a = 10;
//	int b = 20;
//	int c = 0;
//	int d = 0;
//	int e = 0;
//	int f = 0;
//	//&按位与 - 同时为1时则为1,否则为0
//	c = a & b;
//	//00000000000000000000000000001010 - a的补码
//	//00000000000000000000000000010100 - b的补码
//	//00000000000000000000000000000000 - c的补码(原码) = 0
//	//
//	printf("&后 -> %d\n", c);//0
//
//	//|按位或 - 有1则是1，没1则为0
//	d = a | b;
//	//00000000000000000000000000001010 - a的补码
//	//00000000000000000000000000010100 - b的补码
//	//00000000000000000000000000011110 - d的补码(原码) = 30
//	printf("|后 -> %d\n", d);//30
//	
//	//按位异或 - 相同为0，相异为1
//	e = a ^ b;
//	//00000000000000000000000000001010 - a的补码
//	//00000000000000000000000000010100 - b的补码
//	//00000000000000000000000000011110 - e的补码(原码) =  30
//	printf("^后 -> %d\n", e);//0
//	
//	//按位取反 - 对每一位进行取反操作
//	f = ~a;
//	//00000000000000000000000000001010 - a的补码
//	//11111111111111111111111111110101 - f的补码
//	//10000000000000000000000000001010 - f的反码
//	//10000000000000000000000000001011 - f的原码 = -11
//	printf("~后 -> %d\n", f);//-11
//
//	return 0;
//}

//逗号表达式
//从左往右，最后一个表达式的结果就是整个逗号表达式的结果
//#include<stdio.h>
//
//int main()
//{
//	int a = 1;
//	int b = 2;
//	int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式
//	//         1        12      1    13
//	//c是多少?
//	printf("%d\n", c);// 13
//
//	return 0;
//}

//结构体的创建和使用
//结构成员访问操作符: .
//#include<stdio.h>
//
//struct Id
//{
//	int x;
//	int id;
//};
//
//struct student
//{
//	char name[20];
//	int age;
//	struct Id id;
//	double score;
//};
//
//int main()
//{
//	struct student s1 = {"zhangsan", 20 ,15,2000124, 85.0};
//	struct student s2 = {.age = 26, .name = "lisi",.id.x = 20,.id.id = 203521 , .score = 90.5};
//
//	s1.id.x = 10;
//	s1.id.id = 201023;
//	printf("%s %d %d %d %lf\n", s1.name, s1.age, s1.id.x, s1.id.id, s1.score);
//	printf("%s %d %d %d %lf\n", s2.name, s2.age, s2.id.x, s2.id.id, s2.score);
//
//
//	return 0;
//}

//指针变量的创建和解引用
//#include<stdio.h>
//
//int main()
//{
//	int a = 0;
//	int* pa = &a;
//	//int *的理解
//	//*代表pa是一个指针变量
//	//int代表pa指向的是一个int类型的变量
//
//	*pa = 20;//这里的*表示的是解引用的意思
//	printf("%d\n", a);
//
//	return 0;
//}

//指针的大小
//#include<stdio.h>
//
//int main()
//{
//	printf("%zd\n", sizeof(char*));// 64位平台下是8字节，32为平台下是4字节
//	printf("%zd\n", sizeof(short*));// 64位平台下是8字节，32为平台下是4字节
//	printf("%zd\n", sizeof(int*));// 64位平台下是8字节，32为平台下是4字节
//	printf("%zd\n", sizeof(long*));// 64位平台下是8字节，32为平台下是4字节
//	printf("%zd\n", sizeof(long long*));// 64位平台下是8字节，32为平台下是4字节
//	printf("%zd\n", sizeof(float*));// 64位平台下是8字节，32为平台下是4字节
//	printf("%zd\n", sizeof(double*));// 64位平台下是8字节，32为平台下是4字节
//	printf("%zd\n", sizeof(long double*));// 64位平台下是8字节，32为平台下是4字节
//
//	return 0;
//}


//指针的解引⽤
//#include<stdio.h>
//
//int main()
//{
//	int a = 0x11223344;
//	int* pa = &a; 
//	char* pc = &a;
//	*pa;//访问一个int类型的字节空间(4字节)
//	*pc;//访问一个char类型的字节空间(1字节)
//
//	return 0;
//}

//指针 + -整数
#include<stdio.h>

int main()
{
	int a = 10;
	char c = 'w';
	int* pa = &a;
	char* pc = &c;

	printf("&a = %p\n", pa);
	printf("&a+1 = %p\n", pa + 1);//+1就指向下一个int类型的位置，(跳过4字节)
	printf("&c = %p\n", pc);
	printf("&c+1 = %p\n", pc + 1);//+1就指向下一个char类型的位置，(跳过1字节)


	return 0;
}